1.独立
2.交互关系
2.1 竞争关系----互斥锁【解决】
2.2 协作关系----信号量【解决】
注意:竞争关系是写作关系的特例,所以信号量能够解决竞争和协作两种关系的同步问题。
信号量(Semaphore)是一种比互斥锁更强大的同步工具,它可以提供更高级的方法来同步并发进程。所以信号量和互斥锁都是用来解决同步问题的。信号量是more advanced.
由荷兰学者Dijkstra提出,上过数据结构的应该听说过这个娃。
互斥锁只能解决互斥临界区的管理问题,而信号量还能。
A semaphore S is an integer variable that, apart from initialization, is accessed only through two standard atomic operations
信号量s 是一个整型变量,除了初始化,只能由2个院子操作访问,P 【proberen in Dytch “尝试”或“试图”】和 V【verhogen in Dutch 增加】
P:wait() operation
V:signal()operation
各个系统和编程语言中,可能不是用的这个,但是教学中,通常用的这两个。
P(s){
while(s<=0) // 忙式等待 busy waiting
do nothing;
s--;
}
V(s){
s++;
}
p时候是做的忙式等待 busy waiting
一般信号量可以取任意数值,用于控制并发进程对共享资源的访问。
1,2放行,3阻塞, 然后1,2其中之一做完了,3被激活。
Linux调度策略的过程
linux 分为两个模型:
1 Normal 模式 sched_other[RR]
2. real-time 模式
real -time模式的进程优先级永远高于Normal模型
查看模式和pr值
chrt -p 进程id
chrt命令可以修改调度策略和调度模式
查看线程
···
ps -eLf | more
···
你会发现,进程id和主线程的id是一个。 LWP 是线程id pid 是进程id ppid是进程的父进程id
对linux来说,是one to one model,因为many to many的组已经并到one to one了,one to one 也融合了 many to many的特点。
一个多对多模型的变种是将多个用户级别的线程复用到少量或等量的内核线程,同时允许将用户线程绑定到内核线程上。这种变种优势成为两级模型。
Pthreads与POSIX标准(IEEE 1003.1c)相关,定义了线程创建和同步的API,它规范了线程的行为,并非真正的实现。操作系统设计者可能会使用他们期望的任何方式实现该规范。发部分系统实现了Pthreads规范,大部分UNIX类系统,包括Linux和macOS。虽然Windows天生不支持Pthreads,但一些第三方实现了Windows的Ptheads。
fork()和exec()系统调用的语义在多线程程序中有所不同。
如果一个线程调用了fork(),会创建包含所有线程的进程还是会创建仅包含一个线程的进程?一些UNIX系统提供了两种版本的fork(),一种会创建重复所有线程,而另一种仅会创建调用fork()的线程。
exec()系统调用与第三章描述的相同。即,如果一个线程调用了exec(),exec()参数中指定的程序会替换整个进程–包含所有线程。
使用哪个版本的fork()取决于应用本身。如果在forking之后立即调用exec(),由于exec()会替换掉进程,那么fork()是否会重复创建所有线程将没有任何意义,在这种场景下,仅需重复创建调用者所在的线程即可。然而,如果在forking之后,独立的进程没有调用exec(),则新创建的进程会重复创建所有的线程。
很多系统实现了多对多或两级模型在用户和内核线程之间放置一个中间数据结构。该数据结构通常被称为轻量进程或LWP(如图4.20所示)。对于用户线程库,LWP可以看作是应用可以调度用户线程执行的虚拟一个处理器。每个LWP都与一个内核线程关联,且该内核线程会被操作系统调度到物理处理器上运行。如果内核线程阻塞(如等待I/O操作结束),则LWP也会被阻塞。此时与LWP关联的用户线程也会被阻塞。
临界区管理的原则(20字箴言):
有空让进,择一而入,无空等待,有限等待,让权等待
由上图可以看到,自旋锁并非一无是处,而且在多核心处理器系统中,还很有优势,而且大部分情况我们用到的就是自旋锁解决互斥问题的。
临界区:对公共数据进行读和写的代码都是临界区!
对之前售票数据的改造.
PTHREAD_MUTEX_INITIALIZER 是C语言的宏。
可能存在的问题:
代码进入了临界区后,只是了加锁而没有释放锁,或者加锁进入临界区后,崩溃了, 没来及释放锁。
这两种情况,都会造成其它进程进不到临界区。使得其它进程无限等待
磁盘格式化分为低级格式化和高级格式化
低级格式化时把一整块磁盘分词一个个扇区,而每个扇区又分为三部分:head+data+tail, head和tail被称为控制新型,head存储扇区号,tail存储ECC码
磁盘的调度算法:
我的wsl2并没有支持任何调度算法,因为我的是ssd,不管它就是最好的。fcfs
justin@DESKTOP-NIK28BI:/mnt/c/Windows/System32$ cat /sys/block/sda/queue/scheduler
[none]
deadline:适合重负荷的系统,设置deadline,将快到deadline时间的放到高优先级队列,否则在低优先级队列。
cfq:完全公平队列。实现很复杂。为每一个请求设置一个队列。把需要访问的sector放到各自的队列,然后用RR算法。这太繁琐和复杂了。并且针对每个进程内的sector的请求序列,做了优化排序。
三种算法那种算法的性能最好呢?
经测试,A和B差别不大,表现很好,B太复杂,比较差。
FILE SYSTEM
文件系统是对于用户最可见的部分。
文件系统提供了对用户和操作系统的数据课程序的存储和访问的机制。
it provides the mechanism for on-line storage of and access to both data and programs of the operating system and all the users of the computers system—
这句话特别难翻译。
文件类型:
容量单位:TB->PB->EB->ZB->YB->BB->NB->DB