
C&C++相关笔记
关于学习和记录C和C++的相关笔记
_长风_
热爱应是星火,点燃了寂夜,路才更辽阔。
展开
-
进程和程序有什么区别(面试题)
进程和程序有什么区别进程是程序的一次执行过程,是动态概念,程序是一组有序的指令集和,是静态概念进程是暂时的,是程序在数据集上的一次执行,可创建可撤销,程序是永存的进程具有并发行,程序没有进程是竞争计算机资源的最小单位,程序不是进程与程序不是一一对应,多个进程可执行一个程序,一个程序可执行多个程序...原创 2018-08-27 10:17:50 · 3931 阅读 · 0 评论 -
银行家算法(避免死锁最具代表性的算法)
概念点击查看->基本概念如何避免死锁银行家算法,数据结构,算法思想银行家算法中的数据结构: ① 可利用资源向量 Available ② 最大需求矩阵Max ③ 分配矩阵 Allocation ④ 需求矩阵 Need 三个矩阵间存在下述关系:Needp[i,j] = Max[i,j] –Allocation[i,j]算法思想: (1)如果Request i[...原创 2018-08-30 11:48:35 · 2459 阅读 · 0 评论 -
死锁面试题(什么是死锁,产生死锁的原因及必要条件)
什么是死锁?所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。产生死锁的原因?可归结为如下两点:a. 竞争资源系统中的资源可以分为两类: 1. 可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源; 2. 另一...原创 2018-08-30 11:36:30 · 14109 阅读 · 0 评论 -
站在系统角度,常见的文件操作接口的使用
站在系统角度,常见的文件操作接口的使用open系统调用执行的操作:新建一个i节点表元素,让其对应打开的物理文件(如果对应于该物理文件的i节点元素已经建立,就不做任何操作);新建一个文件表的元素,根据open的第2个参数设置file status flags字段,将current file offset字段置0,将v-node ptr指向刚建立的i节点表元素;在文件描述符表中,寻找1个尚未使用的...原创 2018-09-08 10:01:20 · 223 阅读 · 0 评论 -
互斥量,条件变量,信号量,读写锁,自旋锁
互斥量,条件变量,信号量,读写锁,自旋锁互斥锁–保护了一个临界区,在这个临界区中,一次最多只能进入一个线程。如果有多个进程在同一个临界区内活动,就有可能产生竞态条件(race condition)导致错误,其中包含递归锁和非递归锁,(递归锁:同一个线程可以多次获得该锁,别的线程必须等该线程释放所有次数的锁才可以获得)。读写锁–从广义的逻辑上讲,也可以认为是一种共享版的互斥锁。可以多个线程同...原创 2018-09-08 09:41:04 · 338 阅读 · 0 评论 -
理解文件系统中inode的概念
理解文件系统中inode的概念概念:inode就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等inode 是 UNIX 操作系统中的一种数据结构,其本质是结构体在 Linux 中,索引节点结构存在于系统内存及磁盘,其可区分成 VFS inode 与实际文件系统的 inode。VFS inode 作为实际文件系统中 inode 的抽象,定义了结构体 inode...原创 2018-09-08 09:45:19 · 1402 阅读 · 0 评论 -
文件描述符与C FILE*的关系,理解系统调用与库函数(面试题)
文件描述符与C FILE*的关系,理解系统调用与库函数每个进程都有⼀个指针*files, 指向⼀张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针,文件描述符就是该数组的下标。系统调用与库函数 可以认为,f#系列的函数(库函数),都是对系统调⽤的封装,方便⼆次开发。...原创 2018-09-08 09:59:20 · 269 阅读 · 0 评论 -
读者写者模型和生产者消费者模型区别
读者写者模型和生产者消费者模型区别(面试题)从两个模型的原理中可以看出,两个模型最大的区别在于在生产者消费者模型中,生产者与生产者是互斥关系,消费者和消费者是互斥关系,生产者和消费者之间是互斥与同步关系;而在读者写者模型中,读者和读者没有关系,写者和写者是互斥关系,读者和写者是互斥与同步关系。...原创 2018-09-08 09:40:27 · 2183 阅读 · 0 评论 -
浅谈栈和堆(联系与区别)
操作系统栈和堆栈:堆:全局区/静态区:文字常量区:程序代码区:实例栈和堆的区别:栈和堆的联系:操作系统栈和堆地址空间布局: 栈: 执行期间编译器自动分配,编译器用它实现函数调用,调用函数时,栈增长,函数返回时,栈收缩。局部变量、函数参数、返...原创 2018-07-26 23:47:54 · 1600 阅读 · 0 评论 -
线程控制
线程控制(Linux下,pthread库如何控制线程)简单来说是通过pthread簇函数来控制,常见的必不可少的就是创建和终止,具体如下:创建线程(pthread_create)#include <pthread.h>int pthread_create(pthread_t *restrict thread,/ const pt...原创 2018-08-29 10:36:47 · 160 阅读 · 0 评论 -
进程与线程的区别(面试题)
进程与线程的区别进程是资源分配最小单位,线程是程序执行的最小单位;进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;CPU切换一个线程比切换进程花费小;创建一个线程比进程开销小;线程占用的资源要⽐进程少很多。线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数...原创 2018-08-28 20:46:55 · 46002 阅读 · 8 评论 -
临界区,临界资源,原子性(面试题)
什么叫做临界区,临界资源,原子性临界资源:临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。临界区:每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区,进入后,不允许其他...原创 2018-08-29 11:46:26 · 2613 阅读 · 0 评论 -
进程终止
进程终止终止方式1.正常终止,结果正确2.正常终止,结果错误3.异常终止终止方法1.正常终止(可以通过echo $?查看进程退出码)调用_exit函数#include <unistd.h>void _exit(int status)参数:status定义了进程终止状态,父进程通过wait来获取注意:虽然status是int,但只有低八位可以被...原创 2018-08-27 10:25:46 · 412 阅读 · 0 评论 -
进程间通信
进程间通信进程间通信为什么要通信(重点)怎么通信(主要三种方式),通信本质(重点)管道(Unix中最古老的进程间通信的方式)系统IPC(System V IPC资源生命周期随内核)套接字(socket)一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并能够相互传递交换信息为什么要通信(重点)数据传输:一个进程需要将...原创 2018-08-27 13:01:27 · 152 阅读 · 0 评论 -
读者写者模型的理解
读者写者模型的理解什么是读者写者模型读者和写者模型是操作系统中的一种同步与互斥机制,它与消费者和生产者模型类似,但也有不同的地方,最明显的一个特点是在读者写者模型中,多个多者之间可以共享“仓库”,读者与读者之间采用了并行机制;而在消费者和生产者模型中,消费者只能有一个独占仓库,消费者与消费者是竞争关系。读者写者模型的要具有的条件写者是排它性的,即在有多个写者的情况下,只能有...原创 2018-09-08 09:38:41 · 374 阅读 · 0 评论 -
生产者消费者模型的理解
生产者消费者模型的理解生产者消费者模型也叫缓存绑定问题,是一个经典的、多进程同步问题。单生产者和单消费者有两个进程:一组生产者进程和一组消费者进程共享一个初始为空、固定大小为的缓冲区。生产者:生产者的工作是制造一段数据,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待,如此反复;消费者:只有缓冲区不空时,消费者才能从缓冲区中取出消息,一次消费一段数据(即将其从缓存...原创 2018-09-08 09:37:56 · 404 阅读 · 0 评论 -
什么叫做互斥与同步,为什么要引入互斥与同步机制(面试题)
什么叫做互斥与同步,为什么要引入互斥与同步机制互斥:是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。最基本的场景就是:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后...原创 2018-08-28 09:37:19 · 2144 阅读 · 0 评论 -
浅谈进程基本概念
进程概念(PCB[task_struct])进程概念(PCB[task_struct])进程标识,进程间关系进程状态进程在运行中的几种运行状态Linux下的进程状态(R、S、D、T、Z、X)进程优先级基本概念:程序执行的一个实例,正在运行的程序 基于内核:但当分配系统资源(CPU时间、内存)的实体 基于PCB(Linux下称为task_struc...原创 2018-08-27 10:16:24 · 137 阅读 · 0 评论 -
避免死锁
死锁概念基本概念-&gt;翻我牌子来看如何避免死锁三种用于避免死锁的技术:加锁顺序(线程按照一定的顺序加锁)再多线程中,如果一个线程需要锁,那么他就必须要按照一定顺序获得锁thread alock 1lock 2thread b 等待 1//等待线程a中1加锁后才能对3上锁 lock 3(1已经被上锁)thread c ...原创 2018-09-01 10:18:36 · 206 阅读 · 0 评论 -
理解静态库与动态库(浅谈静态动态库的区别)
理解静态库与动态库静态库概念静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库特点可执行文件中包含了库代码的一份完整拷贝静态库的代码是在编译过程中被载入程序中缺点就是被多次使用就会有多份冗余拷贝动态库(动态链接库)概念动态链接提供了一种方...原创 2018-09-01 11:14:24 · 2403 阅读 · 0 评论 -
进程程序替换
进程程序替换替换原理 fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任何一种)来执行另一个任务。当进程调用exec函数时,当前用户空间的代码和数据会被新程序所替换,该进程就会从新程序的启动历程开始执行。在这个过程中没有创建新进程,所以调用exec并没有改变进程的id。替...原创 2018-08-27 10:24:17 · 330 阅读 · 0 评论 -
线程分离
线程分离什么是线程分离(WHAT)简单来讲,线程分离就是当线程被设置为分离状态后,线程结束时,它的资源会被系统自动的回收,而不再需要在其它线程中对其进行 pthread_join() 操作。为什么线程分离(WHY)在我们使用默认属性创建一个线程的时候,线程是 joinable 的。 joinable 状态的线程,必须在另一个线程中使用 pthread_join() 等待其结束,如果...原创 2018-08-29 11:44:50 · 6525 阅读 · 0 评论 -
文件描述符重定向的操作
文件描述符重定向的操作1.linux用文件描述符来标识每个文件对象,文件描述符是一个非负整数,可以唯一地标识会话中打开的文件,每个过程一次最多可以有9个文件描述符;2.0=>STDIN=>标准输入;1=>STDOUT=>标准输出;2=>STDERR=>标准错误;3.STDIN:STDIN文件描述符代表shell的标准输入,对终端界面来说,标准输入是键...原创 2018-09-08 10:02:11 · 302 阅读 · 0 评论 -
浅谈线程基本概念
浅谈线程基本概念站在操作系统管理角度,理解什么是线程线程是不拥有独立资源空间的程序执行流的最小单位站在进程地址空间角度,理解什么是线程线程是进程中的实体,是进程内部的控制序列,和该进程内的其他线程共享地址空间和资源站在执行流角度,理解什么是线程线程是程序中一个单一的顺序控制流程,是程序执行流的最小单位如何理解线程是进程内部的一个执行分支原因60年代...原创 2018-08-28 20:50:58 · 317 阅读 · 0 评论 -
线程等待(为什么要线程等待,如何等待)
线程等待为什么需要线程等待(WHY)?已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。创建新的线程不会复⽤刚才退出线程的地址空间 如何等待(HOW)?功能:等待线程结束 原型#include <pthread.h>int pthread_join(pthread_t thread, void **value_ptr);参数 thread:线程I...原创 2018-08-30 09:03:44 · 5255 阅读 · 0 评论 -
守护进程
守护进程概念理解守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。守护进程也称精灵进程(Daemon),是运⾏在后台的⼀种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。守护进程是⼀种很有用的进程。Linux的⼤多数服务器就是⽤用守护进程实现的。...原创 2018-09-08 09:41:43 · 175 阅读 · 0 评论 -
进程等待
进程等待为什么要等待? 1.子进程退出,如果父进程不管不顾,可能造成僵尸问题,造成内存泄漏 2.一旦变成僵尸状态,kill -9都无能为力,因为没有谁可以杀死一个死去了的进程 3.父进程需要知道子进程完成任务的情况(对错与否,有没有异常退出等) 4.父进程需要通过进程等待的方式回收子进程的资源,获取退出信息怎么等待?(两个接口函数) wait...原创 2018-08-27 10:21:19 · 264 阅读 · 0 评论 -
进程地址空间(分段/分页)
进程地址空间对于一个进程空间分布图如下: 引子:猜猜下面输出结果,为什么呢?#include &lt;stdio.h&gt;#include &lt;unistd.h&gt;#include &lt;stdlib.h&gt;int g_val = 0;int main() { pid_t id = fork(); if(id &lt; 0){原创 2018-08-27 12:58:17 · 7562 阅读 · 5 评论 -
操作符和表达式(C语言)
操作符和表达式操作符和表达式算术操作符(常用)移位操作符左移运算符(&lt;&lt;)右移运算符(&gt;&gt;)位操作符应用赋值操作符简单赋值复合赋值单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员算术操作符(常用)&nbsp;&nbsp;&nbsp;&nbsp;+&原创 2018-07-26 23:50:56 · 164 阅读 · 0 评论 -
数组指针的简单应用
数组指针的简单应用数组指针本质上是一个指针;指向数组首元素地址;应用int main() { float score[][2] = { { 88, 99 }, { 79, 85 }, { 99, 98 }, {100,100} };//定义二维数组来表示语文数学成绩,第一维为变量表示学生的个数 float(*p)[2]; p = (float(*)[2])score; int ...原创 2020-03-19 18:37:48 · 428 阅读 · 2 评论 -
数组和指针
数组和指针数组和指针数组概念理解分类特点指针(Pointer)概念理解C++标准规定,指针分为两类:指针与数组的关系指针与函数(了解)数组概念理解所谓数组,是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个...原创 2018-08-05 15:31:03 · 128 阅读 · 0 评论 -
函数指针的浅薄理解
浅谈函数指针1、函数指针的格式函数指针的声明方法为:返回值类型 ( * 指针变量名) ([形参列表]);“返回值类型”说明函数的返回类型;“(*指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数;后面的“形参列表”表示指针变量指向的函数所带的参数列表,参数列表可有可无,视具体情况而定;函数指针是一个指针,指...原创 2020-03-19 13:01:43 · 113 阅读 · 0 评论 -
宏和函数的区别
宏—(宏和函数的区别)如何定义一个宏函数宏函数#define Min(x, y) ((x)<(y)?(x):(y))对比普通函数int Min(int a, int b){return a<b?a:b}定义宏应该注意优先级问题,要在宏定义的变量和函数加括号,避免优先级问题宏和函数的区别宏做的是简单的字符串替换,而函数是参数传...原创 2018-08-16 08:32:55 · 518 阅读 · 0 评论 -
结构体(对齐规则及举例)
结构体(对齐规则及举例)概念一种数据结构;C语言中聚合数据类型的一类;可以被声明为变量、数组、指针等,用以实现比较复杂的数据结构;是一系列元素的集合,这些元素被称为结构体成员;结构体成员需要用结构体名访问。结构体声明struct A{ //struct是关键字, A是结构体标志 int a; //a,b是结构体成员列表 char b;}s1;...原创 2018-08-07 11:37:03 · 3901 阅读 · 0 评论 -
判断一个字符是否为数字的两种方法(C/C++)
判断一个字符是否为数字的两种方法(C/C++)在平时,我们经常遇见判断字符是否为数字这种题目,虽然感觉还是很简单,不过我是个更喜欢用函数的人,因为我觉得这样更便捷,所以我更推荐第二种方式。1.直接判断#include <stdio.h>int main(){ char c; c = getchar();//读取一个字符。 if(c ...原创 2018-08-05 15:33:33 · 107830 阅读 · 5 评论 -
指针和引用(传指针和传引用)
指针和引用(传指针和传引用)指针和引用(传指针和传引用)前言联系区别C++中指针传递和引用传递前言指针本质上就是一个存放变量地址的变量,逻辑上是独立的,它可以被改变,包括指向地址的改变和地址所存放数据的改变。引用本质上是一个别名,逻辑上具有依附性,只在定义时初始化一次,是不可变的(从始至终只能依附在一个变量)。联系都是地址的概念...原创 2018-08-05 15:31:41 · 347 阅读 · 0 评论 -
浅谈malloc/free和new/delete 的区别
浅谈malloc/free和new/delete 的区别malloc和new的区别free和delete 的区别为什么有了new/delete后,还要保留malloc/free?浅谈malloc/free和new/delete 的区别malloc和new的区别malloc是库函数,需要包头文件才能成功运行编译;new是操作符(C++中的关键字),需要...原创 2018-07-27 00:08:35 · 255 阅读 · 0 评论 -
判断是大端还是小端字节序
判断是大端还是小端字节序#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdbool.h>int main(){ int a = 1; //取a的指针强制转换为char*类型,然后再解引用, //此时取到的值是int的最低字节 if (*((char*)&a...原创 2018-06-08 20:40:05 · 209 阅读 · 0 评论 -
将一个数组逆序放到原来数组中
将一个数组逆序放到原来数组中 int main(){ int a[] = {1,2,3,4,5,6,7,8,9,10,11,12}; int s = sizeof(a) / sizeof(a[0]); for (int i = 0; i < s / 2; i++) { int x = a[s - 1 - i]; a...原创 2018-06-08 20:38:37 · 1795 阅读 · 0 评论 -
整数的倒序输出
输入一个整数(任意位数),倒序输出#include<math.h>int Get_len(int n) //计算这个数的位数{ int i = 0; for (n; n > 0; n /= 10) ++i; return i;}int Inorder(int n) //逆序{ int m = 0; ...原创 2018-06-08 20:37:31 · 4650 阅读 · 0 评论