- 博客(26)
- 收藏
- 关注
原创 Linux----网络端口
一、网络端口的概念 1、什么是网络端口: 在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等;二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的2
2017-06-21 13:22:18
2005
原创 Linux进程间通信----共享内存
一、共享内存 1、共享内存的概念: 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某
2017-06-15 22:13:38
353
原创 Linux----线程安全和可重入函数
一、线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全
2017-06-12 22:34:00
329
原创 Linux----普通版本的mysleep与规避竞态条件的mysleep对比
一、普通情况下的mysleep 先了解一下SIGALRM信号、alarm函数和pause函数。 SIGALRM时钟定时信号, 计算的是实际的时间或时钟时间。alarm函数使用该信号。unsigned int alarm(unsigned int seconds); alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时
2017-06-12 12:54:33
547
1
原创 Linux----子进程的异步等待方式
一、关于进程等待相关博客:http://blog.csdn.net/rengui1228/article/details/73064852二、基础知识 1,进程的各种状态 Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 在下文将对进程的R、S、D、T、Z、X 六种状态做个
2017-06-12 00:13:39
295
原创 Linux内核中的进程等待与其实现解析
一、进程等待的概述 进程通过fork产生子进程,进程也会死亡,进程退出的时候将会进行内核清理,释放所有进程的资源,资源包括:内存资源,文件资源,信号量资源,共享内存资源,或者引用计数减一,或者彻底释放。 不过进程的退出并没有把所有资源释放,保留一一些资源,比如进程的PID依然被占用,不可被分配,来看看僵尸进程依旧占有的资源:进程控制块task_struct
2017-06-11 22:36:39
567
原创 Linux内核中的信号量
Linux内核中的信号量 信号量的本质是⼀种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。当请求⼀个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可⽤。大于0,资源可以请求,等于0,⽆资源可⽤,进程会进入睡眠状态直⾄资源可⽤。当进
2017-06-11 14:18:10
1030
原创 Linux内核中的管道
一、介绍关于进程间通信 Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限
2017-06-11 00:30:42
1250
原创 Linux内核中的线程死锁
一、死锁的概念 1.什么是死锁: 死锁 (deadlocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分
2017-06-09 00:18:26
494
原创 Linux内核中的线程及多线程
一、线程的概念、理解及特点 1.线程的概念: 至今为止,Linux下还是没有“真正的线程”。谈到线程就不得不提到进程这概念,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段,代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一步减少处理机的空转时间支持多个处理器和减少上下文切换开销,进程在演化中出现了另一个
2017-06-08 16:10:08
654
原创 Linux内核中的信号(一)
一、Linux信号的基本概念1、什么是信号? 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kil
2017-06-08 01:10:44
708
原创 线性表链接存储
以下是关于线性表链接存储(单链表)操作的11种算法 1.初始化线性表,即置单链表的表头指针为空 2.创建线性表,此函数输入负数终止读取数据 3.打印链表,链表的遍历 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 5.返回单链表的长度 6.检查单链表是否为空,若为空则返回1,否则返回0 7.返回单链表中第pos个结点中的元素,若
2017-01-04 19:54:11
586
原创 打印乘法口诀表
打印乘法口诀表的(精简版)#include#include#include#pragma warning(disable:4996)void multiplication_table(int line) //乘法口诀表实现函数{ int i = 1; for (; i <= line; i++) { int j = 1; for (; j <= i; j++)
2017-01-03 13:14:29
864
原创 二分法的解读汇总
二分法的解读汇总(一) 二分查找,最基本的算法之一,也是面试中常被考察的重点,因为基本的算法最能反映出一个人的基础是否扎实。本文对二分查找相关题目做一个总结。 在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。
2017-01-02 09:05:02
7162
原创 模拟实现一个字符串的反转
#include #include #include //断言的库函数文件,用以执行时抛出异常#include void my_reverse(char *left,char *right) //定义具有逆置字符功能的函数{char tmp=NULL;assert(left); //断言,以保证传进的两个指针类型的参数是否不为空
2017-01-01 09:57:11
332
转载 模拟实现一个字符串的反转的9种方法
1. 使用Array.Reverse方法对于字符串反转,我们可以使用.NET类库自带的Array.Reverse方法public static string ReverseByArray(string original){char[] c = original.ToCharArray();Array.Reverse(c);return new string(c);
2017-01-01 09:24:07
3201
1
原创 编写代码,演示多个字符从两端移动,向中间汇聚
练习:编写代码,演示多个字符从两端移动,向中间汇聚。#include #include int main (){ char arr1[]="Welcome to China!!!"; char arr2[]="###################"; int len=strlen(arr1); int left=0; int right=len-1; printf("%s
2016-12-30 13:27:42
373
原创 用冒泡法对M个整数从小到大排序
分析:冒泡法排序的过程是:设有M个元素,要求从小到大排序。每次从首元素开始两两比较,即arr[j]和arr[j+1]比较,若arr[j]大于arr[j+1]则两元素交换,否则不交换,这样每一轮比较后都可得到“大数沉底,小数上浮一个位置”的结果,也就是说第一轮排好数组最后一个元素,第二轮排好数组最后两个元素。。。 经过M-1轮比较后排序结束。代码实现如下:#include#
2016-12-29 13:41:24
4210
原创 C函数调用原理----栈帧
函数调用原理----栈帧1.关于栈首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸,那么就很明显了,栈有栈底和栈顶,那么栈顶的地址要比栈底低。对x86体系的CPU而言,其中---> 寄存器ebp(base pointer )可称为“帧指针”或“基址指针”,其实语意是相同的。---> 寄存器esp(stack poi
2016-11-18 09:31:14
471
原创 关于const的定义以及用法
c/c++语言中的const:一、概念和作用:1、常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新和改变的。2、const关键字的作用主要有以下几点: (1)可以定义const常量,具有不可变性。 例如: const int Max=100; int Array[Max]; (2)便于进行类型检查,使编
2016-11-07 12:22:54
7588
1
原创 实现三个整数数a,b,c的比较大小,并且按大到小的顺序输出
我用C语言实现三个整数数a,b,c的比较大小,并且按大到小的顺序输出,下面的程序是我用主函数(main())调用自定义函数(fun2()),再用fun2()函数调用fun1()函数的方法!!!!!!#include void fun1 (int *p1,int *p2) { int temp; temp=*p1; *p1=*p2;
2016-09-29 08:27:51
7783
原创 运用指针实现三个整数a,b,c由大到小的顺序输出(函数间的调用)
初学编程者,要多多学会运用主函数调用自定义函数,这样一来程序变得更有层次化,为后期维护代码也变得更加方便,下面程序是最简单的主函数调用自定义函数方法,希望能为初学者带来小小的见解......#include void fun1 (int *p1,int *p2) //自定义fun1函数{ int p; p=*p1; *p1=*p2; *p2=p;}void
2016-09-28 21:03:10
7798
原创 我用C语言实现“ 输入一个整数n,并求该整数n的阶乘”
#include#includeint main(){ int factorial=1,i,n; printf(" 输入一个整数n,并求该整数n的阶乘:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { factorial=i*factorial; } printf("n的阶乘为:%d\n",factorial); system("p
2016-09-27 16:55:05
30845
1
原创 我用C语言 写一个函数返回参数二进制中 1 的个数的三种不同方法
1.#includeint count_one_bits(unsigned int value){int count=0; while(value){if(value&1==1)count++;value>>=1;}return count;}int main (){int ret=0,num=0;scanf("%d
2016-09-27 11:42:57
405
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人