11 2018 档案
摘要:生产者——消费者问题生产者——消费者问题是一个经典的同步问题,生产者生成的数量存在一个上限,不能生成超出这个上限。消费者不能消费未生产的东西。假设如下:mutex信号量是生产者和消费者共享缓冲区的互斥要求,缓冲区的大小为n。设缓冲区空用empty表示,并初始化为1,设...
阅读全文
摘要:操作系统中存在多个进程并发访问和操作同一个数据,并且执行结果和进程执行的特定顺序有关,称为:竞争条件。为了防止竞争条件发生,我们需要确保一段时间内只有一个进程能操作这个数据。为了实现这个保证,进程之间必须要同步。假设一个OS有n个进程,每个进程有一个“临界区”。在该区...
阅读全文
摘要:在Linux下和Windows最大的不同可能在于用户使用操作系统的方式,在Windows下通常是点击鼠标来打开一个应用程序,或者完成某一个操作。但是Linux下更多是使用Shell命令来操作。它是用户使用Linux的桥梁。Shell既是一种编程语言,也是一种命令语言。...
阅读全文
摘要:散列表散列表:通常,我们称散列的实现为散列表。散列是一种支持常数时间执行插入,删除,查找的技术,但是散列不支持排序操作。因此,FindMax,FindMin诸如此类的操作都将不支持。看到这里,我相信大家都明白我们为什么需要散列表了吧。(它能实现常数时间执行插入,删除,...
阅读全文
摘要:信号是在软件层面对中断机制的一种模拟,信号的出现使得进程直接的通信不在是被动的,不在向之前那样,read()操作往往需要等待write()操作结束。因为信号是对中断的一种模拟。既然是中断,那么它的发生就是不确定。就不会发生一个进程阻塞在这里等待另一个进程执行的结果。这...
阅读全文
摘要:我们运行如下命令,可看到Linux支持的信号列表:$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SI...
阅读全文
摘要:管道(pipe)是无名管道,他是进程资源的一部分,随着进程的结束而消失。并且它只能在拥有公共祖先进程的进程内通信。而有名管道(FIFO)的出现则解决了这个问题。FIFO提供了一个路径名与它关联。这样可以通过访问该路径就能使得两个进程之间相互通信。此处的FIFO严格遵守...
阅读全文
摘要:进程如果不是独立进程,那么它就需要和别的进程进行通信。在进程协作时可以采用共享一个缓冲区的方式来实现。当然,OS的IPC提供了一种机制,以允许不必通过共享地址空间来通信和同步其动作。这就不得不提Linux的的前身Unix。因为Linux一开始就是从这儿借鉴的。加上Li...
阅读全文
摘要:在Linux下,一切皆文件。这是我们嵌入式Linux开发与应用这门课的老师经常挂在嘴边的一句话。足以体现出在Linux操作系统中,对于一切资源的管理都是对文件的操作。Linux系统中每一个分区都是一个文件系统,都有自己的目录层次。Linux会将这些在不同分区的,单独的...
阅读全文
摘要:在Linux下,进程退出就表示进程即将结束了(为什么是即将,这是因为Linux设计的是父进程给子进程收尸)。正常退出包括3种情形。main函数中执行return 0; 调用exit函数,函数原型:void exit(int status); 调用_exit函数,函数原...
阅读全文
摘要:僵尸进程就是已经结束的进程(几乎不占计算机资源),但是它并没有从进程列表中删除。僵尸进程太多会导致操作系统的进程数目过多,从而占满了OS的进程表。进而导致无法创建新进程,致使OS崩溃。僵尸进程几乎不占资源,它没有可执行代码,也不能被调度,但是它占据着进程表中的一个位置...
阅读全文
摘要:在Linux下使用fork或者vfork函数创建的子进程是完全复制父进程的代码来执行的。虽然我们可以使用fork函数返回值的不同来使得父进程和子进程执行的代码不同。但是有时候父进程是一段c程序,子进程却是个shell。这个时候,fork就没法解决这个问题。因此exec...
阅读全文
摘要:创建新进程在Linux的下是由父进程来完成的,创建完成的新进程是子进程对于子进程它有两种执行顺序的可能性:父进程和子进程并发执行; 子进程先执行,父进程等待子进程执行完毕。另外新进程的地址空间也有两种可能性:子进程是父进程的复制品(除了PID和task_struct中...
阅读全文