- 博客(21)
- 收藏
- 关注
原创 避免死锁------银行家算法
本文中的相关理论出自该书: 计算机操作系统(第四版)(汤小丹等编) 在死锁产生的必要条件一文中,提到了死锁产生的四个必要条件,本文将通过银行家算法来阐述如何避免死锁的产生。在介绍该算法之前先介绍有关系统状态的概念。 在避免死锁产生时,系统的状态可分为安全状态和不安全状态。当系统处于安全状态时可以避免产生死锁,反之,当处于不安全状态时,就会产生死锁。安全状态 ...
2018-04-25 17:46:46 1451
原创 操作系统------死锁产生的必要条件
现有一双筷子每支标为1,2(分开放)。有A,B两人竞争筷子来吃饭。当A拿到1后,要去拿2,此时却发现B已经拿到了2。而B要拿1时却发现它已经被A拿到。双方都希望对方能够放弃他所拥用的的一支筷子。而不愿放弃自己所拥有的。此时,二者便陷入了僵持状态,从而形成了死锁。计算机中死锁的产生 计算机中的资源通常分为两类:一类叫可重用资源,一类叫可消耗资源可重用资源 ...
2018-04-25 16:35:29 439
原创 操作系统------线程控制:线程的创建,等待与分离,终止
在线程的概念一文中,有提到在Linux下的线程的实现是通过NPTL线程库实现的。即每一个用户态的线程对应于内核中的一个调度实体(一个PCB/一个内核级线程)。可以说,一个Linux下的线程包含两部分组成:一个用户级的线程,一个内核级的线程(PCB)。 之前有提到过,操作系统并不知道用户级线程的存在。而Linux中的线程又包含一个用户级的线程。所以该用户级线程的实现是通...
2018-04-25 11:48:43 1281
原创 操作系统------线程的概念/线程与进程的区别
线程的引入 在“进程的概念”一文中,提到了进程的两个基本属性:(1)进程是一个可拥有资源的基本单位。包括PCB,地址空间,页表,物理内存上的数据和代码等。(2)进程同时又是一个可独立调度和分派的基本单位。每个进程都有唯一的一个PCB,操作系统通过PCB感知进程的存在,进而调度进程。 为了使程序能够并发执行,操作系统必须:(1)创建进程:为其分配资源和PCB等(2)进程切...
2018-04-24 22:21:42 562
原创 操作系统------生产者消费者模型
在“进程间通信----信号量”一文中,有简单介绍过生产者消费者模型的基本概念。在下文中将使用有关线程的互斥与同步的相关概念来实现两种不同类型的生产者消费者模型。在本文中侧重于线程间同步的实现。有关线程互斥与同步的相关概念见线程的互斥与同步一文: 首先介绍该模型的背景知识:生产者消费者问题 该问题是一个著名的同步问题。它描述的是:一群生产者进程正在生产产品...
2018-04-24 18:06:59 5117
原创 线程的同步与互斥
在之前的“进程间通信—-信号量”一文中,有介绍过进程的同步与互斥。在本文中,着重来介绍线程的互斥与同步。线程的互斥我们知道,一个进程中的多个线程之间是共享进程所拥有的一个地址空间。它们除了私有上下文,私有栈等少量资源是独有的,其余大部分资源都是共享的。比如说,文件描述符表。当一个线程以只读的方式打开某一文件时,与它所在同一进程的其他线程也是可以读取该文件的。多个线程之间共享资源。这对于...
2018-04-24 00:20:14 634
原创 迷宫问题求解
问题一:在迷宫中找到出口(只需找到一个即可) 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口。问题分析:1. 首先要有一张迷宫地图,地图由两部分组成: (1)一是迷宫中各处的位置坐标, (2)二是迷宫各位置处的状态信息,即该处是墙还是路 所以,该迷宫地图可由一个二维数组来表示。数组的横纵坐标表示迷宫各处的位置坐标,数组元素表示各位置处的状态信息...
2018-04-21 01:32:52 34074 3
转载 gdb调试多进程与多线程 【转载】
以下文章转载自:https://blog.csdn.net/snow_5288/article/details/72982594一,gdb的基础知识1>介绍: gdb是Linux环境下的代码调试工具。 2>使用:需要在源代码生成的时候加上 -g 选项. 3>开始使用: gdb binFile 4>退出:ctrl + d 或 quit 5>调试过程中的常用命令: l...
2018-04-16 16:22:33 166
原创 实现mysleep,可重入函数,SIGCHLD信号
一,pause函数实现sleepint pause(void);//头文件<unistd.h> 该函数的功能是使调用进程挂起直到有信号递达。如果处理动作是终止进程,则进程终止,函数不再返回;若处理动作是忽略,则进程继续挂起;若是自定义行为,则捕捉信号后返回-1。所以该函数只有出错的返回值。 #include <unistd.h> unsigned int s...
2018-04-16 15:27:18 301
原创 信号集,信号屏蔽字,捕捉信号
一,信号,信号集1. 信号相关的概念 信号递达:实际执行信号的处理动作 信号未决:从信号产生到信号递达之间的状态 信号阻塞:如果一个信号被阻塞,那它在产生时处于未决状态,不会被递达,只有解除该信号后,才被递达。注意:信号的阻塞,是还未执行处理动作,而信号的忽略是正在处理信号,但信号的处理动作是忽略。这两者是不同的。2. 信号在内核中的表示 我...
2018-04-16 15:22:51 458
原创 信号的概念及信号产生的条件
一,信号的基本概念 生活中有很多信号。比如,早上的闹钟响了,你可以识别出这是通知你起床的信号,你可以采取不同的措施来处理(起床或继续睡);放学铃响了,通知大家现在到了放学时间;等等,还有很多各种各样的信号。这些信号因为某些原因产生后(比如提前设定了闹钟),首先会识别它属于什么信号(通知起床的还是其他的),然后在给出处理这些信号的动作。 在操作系统中,也有信号通知机制。当...
2018-04-16 15:03:41 1640
原创 栈和队列常见笔试题
以下有关栈的知识请见这篇博客:https://blog.csdn.net/sandmm112/article/details/79860236 以下有关队列的知识请见这篇博客:https://blog.csdn.net/sandmm112/article/details/79860257 前面我们介绍过了栈和队列的两种实现方法以及一些基本操作。下面利用之...
2018-04-16 14:53:02 4096
原创 进程间通信------信号量
以下用到的消息队列中的相关内容,均可在这里找到:https://blog.csdn.net/sandmm112/article/details/79936107 信号量是进程间通信的有一种方式。之前有提到共享内存是不带同步与互斥机制的,这样在多个进程同时对共享内存写入数据时,会导致数据错乱。而信号量就是确保多个进程在对共享内存这样的共享资源同时读写时,使之实现互斥与同步的,...
2018-04-14 12:38:13 949 1
原创 进程间通信------共享内存
以下用到的消息队列中的相关内容,均可在这里找到:https://blog.csdn.net/sandmm112/article/details/79936107 共享内存是进程间通信的一种方式。系统中物理内存结构及进程与共享区的映射关系如下: 创建一个共享内存是指在共享取开辟一片区域,将该区域分别映射到两个进程的虚拟地址空间中,那这两个进程便可以通过这片共享区...
2018-04-14 01:01:30 250
原创 进程间通信------管道
通过前面对进程概念,进程控制的了解,我们知道,每个进程都有自己独立的用户地址空间,任何一个进程中的全局变量在另一个进程中是看不到的。所以进程间的运行是相互独立的。这样做可以保证安全,当一个进程出现问题时,不至于影响其他进程。 但是,当不同进程间要进行传输数据,共享资源,通知消息,进程控制等操作,此时,相互独立的进程是做不到这些的。所以,为了进行这些操作,相互独立的进程...
2018-04-14 00:02:55 271
原创 进程间通信------消息队列
消息队列 消息队列是进程间通信的另一种方式。一个进程通过系统调用接口创建一个消息队列。操作系统会在内核中开辟一片内存用于进程间通信。而这片内存现在又以消息队列的形式来进行通信的。 消息队列提供了一个进程向另一个进程发送数据块的方法来进行通信。每个数据块都有一个类型,接收进程根据类型来接受自己想要的数据块,且消息的读取不一定是先入先出的,它是由类型决定的。 ...
2018-04-14 00:00:38 413
原创 顺序队列/链式队列
队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。 与线性表相似,队列也有两种存储结构:顺序队列和链式队列。一,顺序队列 顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数...
2018-04-09 15:49:55 2222
原创 顺序栈/链式栈
栈是是一种限定性的线性表,它将线性表的插入和删除限定为仅在表的一端进行。将表中允许插入和删除的一端成为栈顶。所以栈顶的位置是不断动态变化的。它具有“后进先出”的特点。因为栈是由线性表实现的,所以,栈有两种存储结构:顺序存储和链式存储。对应的栈成为顺序栈和链式栈。下面,分别来介绍这两种栈的相关操作。一,顺序栈 它与顺序表类似,即用一组地址连续的空间存放栈中的元素。之前的...
2018-04-09 00:30:44 11443
原创 双向,带头节点,带环链表的基本操作
前面已经介绍过了不带头节点,不带环的双向链表,以下将介绍带头节点,带环的双向链表的基本操作。 不带头结点时,用一个头指针代表整个链表。带头节点,则用头结点来表示整个链表。此时,头结点的数据域是没有意义的,对其任意赋值即可。如下图: 当链表是单向时,只有一个next指针指向下一个节点。而双向时,除有next指向下一个节点外,还有一个prev指针指向前一个结...
2018-04-08 22:07:33 522
原创 单链表的常见笔试题(2)
本文中接着列举一些常见的有关单链表的笔试题。1. 判断单链表是否带环 如果一个链表带环,则该链表的尾节点的next必不指向空,而是指向在他之前的某一节点,类似这样的: 那么该如何判断呢?方法一: 首先将头结点的地址存放在一个顺序表中。从头开始遍历链表,比较每个节点的next域是否在顺序表中出现,如果出现了,说明该链表带环,如果没有出现,将该...
2018-04-01 17:12:10 444
原创 单链表的常见笔试题(1)
在之前的“单链表基本操作”博客中,介绍了一些关于单链表的增删查改等基本操作。在本文中,对单链表的操作升级,列举一些常见的有关单链表的常见笔试题。 注意:该单链表还是无头结点,单向,无环的。有关链表的信息与“单链表基本操作中”相同。1. 逆序打印单链表 链表正常的输出顺序是从头开始输出,如果逆序的话,最后输出的是头结点,先输出的是最后一个节点,此过程可以通...
2018-04-01 11:17:03 842
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人