PCB(是进程的唯一标识)+数据段+代码段
PCB:为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
管道又分为匿名管道和命名管道
信号的本质其实就是修改程序的PCB
PCB:为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
最快通信方式
一般不同主机上的不同进程通信
计算机系统抽象组成: CPU + 存储器 + IO
资源:
对于单核cpu同一时刻只能有一个任务运行。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度 的基本单位
停止状态按ctrl+z停止的话,按fg可以继续运行
就绪+运行状态 线程队列的一个情况来反映出cpu一段时间内的繁忙程度
1核cpu :load average = 1 处于满负荷的临界点了>1就超负荷了
threading用于提供线程相关的操作,线程是应用程序中工作的最小单元、
构造方法: Thread(group=None, target=None, name=None, args=(), kwargs={})
import requests
import time
import functools
import threading
def runtime(func):
print("this is runtime")
#保留传递进来的函数的元数据,将他的元数据赋值给Inner
@functools.wraps(func)
def inner(*args,**kwargs):
start = time.time()
result = func(*args,**kwargs)
end = time.time()
print(f"函数执行花了{end - start}s")
return result
return inner
def get_content(url):
text =requests.get(url).content
time.sleep(0.5)
print("get content")
@runtime
def main():
t_list = []
for i in range(5):
#get_content("https://www.baidu.com") 单线程
# 创建线程
#target -->指定传入的方法核名字,要做什么
#args -->指定方法需要传入的参数,元组类型
t = threading.Thread(target = get_content,args=("https://www.baidu.com",))
t_list.append(t)
# t.daemon = True #默认是前台线程(False)设置后台线程,主线程退出子线程也退出
t.start() #启动线程 自动执行run方法
for t in t_list: #主线程执行这一部分
# #阻塞当前环境上下文,直到t的线程执行完成
# #谁执行这个join代码,谁就是当前环境
t.join(timeout=0.2)
print("ending .....")
main()
使用自定义类创建
import threading
class MyThread(threading.Thread):
def __init__(self,num):
super(MyThread,self).__init__()
self.num = num
def run(self):
print(f"running on numers:{self.num}")
t1 = MyThread(1)
t2 = MyThread(2)
t1.start()
t2.start()
在多线程中使用lock可以让多个线程在共享资源的时候遵循一定的规则。
解决资源争用,数据读取不一致等
构造方法:Lock()
实例方法:
# #LOCK / RLOCK
# #互斥锁 -- 解决资源争用,数据读取不一致等问题
#
# import threading
# import time
# import functools
#
# def runtime(func):
# print("this is runtime")
# #保留传递进来的函数的元数据,将他的元数据赋值给Inner
# @functools.wraps(func)
# def inner(*args,**kwargs):
# start = time.time()
# result = func(*args,**kwargs)
# end = time.time()
# print(f"函数执行花了{end - start}s")
# return result
# return inner
#
# num = 0
# @runtime
# def sum_num(i):
# lock.acquire() #获取锁
# global num
# time.sleep(0.5)
# num +=i
# print(num)
# lock.release() #释放锁
#
# lock = threading.Lock() #创建一个锁对象,一般只在公共资源加锁
# for i in range(5):
# t = threading.Thread(target = sum_num,args=(i,))
# t.start()
# import threading
# import time
#
# num = 0
# def sum_num(i):
# # lock.acquire() #获取锁
# with lock: #类似withopen,自动获取核释放锁
# global num
# time.sleep(0.5)
# num +=i
# print(num)
# # lock.release() #释放锁
#
# lock = threading.RLock() #创建一个锁对象,一般只在公共资源加锁
# for i in range(5):
# t = threading.Thread(target = sum_num,args=(i,))
# t.start()
#死锁
#1.第一种情况
#LOCK 原始锁 获取锁之前不做判断,直到获取到锁位置
#RLOCK 重入锁 获取锁之前先判断,如果自己有了锁就立即返回
# import threading
# # lock1 = threading.Lock()
# lock1 = threading.RLock()
# lock1.acquire()
# print("lock1 acquire")
# lock1.acquire()
# print("lock1 acquire2")
# lock1.release()
# print("lock1 release")
# lock1.release()
# print("lock1 releas2")
# 第二种
#账户类
from threading import Lock,Thread
class Account:
def __init__(self,_id,balance,lock):#每个账户自带一个锁,只要对balance
self._id = _id
self.balance = balance
self.lock = lock
def withdraw(self,amount):
self.balance -= amount
def deposite(self,amount):
self.balance += amount
def get_balance(self):
return self.balance
#生成两个账户
wei = Account("魏军林",50000,Lock())
liu = Account("刘畅",10000,Lock())
#转账函数,谁的账户金额摇动,需要先上锁
#from 要转出的账户,to 转入账户
import time
def transfer(from_,to,amount):
if from_.lock.acquire(): #from账户上锁
from_.withdraw(amount) #from账户减少
print(f"{from_._id}转账{amount}元")
# time.sleep(1)
if to.lock.acquire():
to.deposite(amount) #to账户加钱
to.lock.release() #to账户加钱完毕,解锁
from_.lock.release() #from账户也转账完毕,解锁
print(f"{from_._id}成功转了{amount}给{to._id}")
# transfer(wei,liu,5000)
# print(wei.get_balance())
# print(liu.get_balance())
#生成两个线程,同时转账
t1 = Thread(target=transfer,args=(wei,liu,5000)) #魏军林给流畅转5000
t2 = Thread(target=transfer,args=(liu,wei,500)) #刘畅给魏军林转500
t1.start()
t2.start()
t1.join()
t2.join()
#避免死锁
#尽量避免同一个线程对多个lock进行锁定
#多个线程对多个lock进行锁定的时候,尽量保证他们以相同的顺序加锁
最多允许同时N个线程执行内容
构造方法: Semaphore (N)
实例方法:
import threading
import time
num = 0
def sum_num(i):
# lock.acquire() #获取锁
with lock: #类似withopen,自动获取核释放锁
global num
print(f"this is thread{i}")
time.sleep(5)
num +=i
print(num)
# lock.release() #释放锁
lock = threading.BoundedSemaphore(2) #定义了两把钥匙,同时有两个线程去执行
for i in range(5):
t = threading.Thread(target = sum_num,args=(i,))
t.start()
用于主线程控制其他线程的执行。
实例方法:
该机制会使得线程等待,只有满足某条件时,才释放n个线程。
实例方法:
linux通信:互斥锁+信号量+条件变量
保证同一个进程内同一时刻只有一个线程能执行