- 博客(27)
- 收藏
- 关注
原创 Linux编程之线程介绍
首先来看下进程和线程的关系,线程是进程中的一个单一控制流,它是操作系统运算调度的最小单位,即线程是执行的最小单位,进程是最小的分配资源单位。在Linux下,有时候我们又称线程为轻量级进程,因为进程和线程它们的底层实现都是由一个叫做clone的函数来实现的。这个clone函数是比较底层的,它可以克隆一切可写的东西,例如:堆,栈,非只读数据段等等。在内核层面来看,进程和线程是一样的,它们共享同一片内存
2016-11-12 16:40:48
756
原创 Linux编程之信号处理
信号是类Unix系统中的一种通知机制。在Linux下,我们可以通过kill -l命令来查看有哪些信号。Linux下有64个信号,其中前32个信号是经典信号,后32个是用于驱动开发要用到的。那么信号是如何产生的呢?主要有以下几种方式可以产生信号:1.终端的特殊按键。比如说ctrl + d,ctrl + c等2.kill 命令及函数。3.硬件异常。如:非法访问内存,除零操作。4.某
2016-09-23 20:06:05
935
原创 Linux编程之会话与守护进程
什么是会话?我们知道一个进程有组id,当多个进程的组id相同时,我们称这些进程隶属于同一个进程组,而会话则是由进程组组成的,会话也有会话id,我们通过ps ajx可以看到一栏名为sid,这个sid就是会话id。我们可以通过setsid函数来将一个进程脱离原有的会话,建立新的会话。但是,要想该函数调用成功,需要注意以下2点:1. 调用进程不能是进程组的组长,否则会出错2. 需要root权
2016-09-20 22:53:47
876
原创 linux编程之进程初探
什么是进程?一个可执行程序?NO,可执行程序在我们的磁盘上只是一个文件而已,当可执行程序运行起来以后,那才叫一个进程。 进程有几种基本的状态,运行,就绪,睡眠,停止。 运行:当CPU在执行这个程序的时候,该进程就处于运行状态。 就绪:进程已准备好所有的事情,就只差CPU来运行了,我们称该进程处于就绪状态。
2016-09-12 21:09:35
595
原创 linux下的ext2文件系统
当我们刚拿到一块磁盘的时候,我们需要将磁盘格式化成某种格式的文件系统,这样才能让磁盘存储数据。在windows下,使用的是一种叫做NTFS的文件系统,而在Linux下,使用的是ext系列的文件系统,现在最新的版本是ext4,不过原理都差不多,这里就ext2文件系统做个简要的介绍。在文件系统中,最小的单位是块,默认情况下,一个块的大小是4096个字节,当然你也可以在初始化分区的时候自己指定。我们
2016-09-02 18:49:39
1149
原创 windows Socket编程之完成端口模型
上篇介绍了重叠IO模型,它已经把我们的等待数据到来和拷贝数据到我们程序的缓冲区这个时间全部交给了操作系统去完成了,它已经很完善了。但是,如果我们想要把服务端的性能做的更好一点的话,它还是有点不足的,比如说,重叠IO它只有一个工作者线程在工作,要想获得更高的效率,我们应该增加一些线程。而且,重叠IO它只能同时进行64个客户端的数据收发,这也是一个很大的问题。为此,就产生了完成端口模型,它就解决了这些
2016-08-17 15:09:11
2332
2
原创 windows Socket编程之重叠IO模型
上一篇文章我们讲了EventSelect网络模型,它已经解决了等待数据到来的这一大部分时间,但是它还有一小部分时间没有节省下来。那就是把数据从网卡的缓冲区拷贝到我们应用程序的缓冲区里边。而这一篇的重叠IO模型就是将这一小部分的时间也给节省了下来。
2016-08-14 15:17:03
6219
原创 windows Socket编程之EventSelect网络模型
前一篇文章我们讲了select网络模型,它解决了有N个客户端连接,就有N+1个线程的问题,现在我们只需要2个线程就能搞定了。但是,我们的服务端仅仅是这样的话,它的效率还是非常低的。在select模型中,我们在工作者线程里边调用了select函数来判断是否有数据到来了(有信号了),如果没有信号,select就会卡在这里,虽然我们可以给它一个超时时间,但是它在底层还是调用了sleep函数。所以它浪费了CPU的时钟周期,由于我们不知道客户是什么发送数据过来,可能是1秒,可能是1小时,也有可能是1天,所有等待数据到
2016-08-11 19:57:01
4044
原创 windows Socket编程之select网络模型
在此之前呢,介绍了TCP/UDP的服务端的实现。但是,它们有很大的缺点,比如说,效率很低,开销太大等。因此,接下来我们先介绍select网络模型。我们在TCP的服务端里边,接收一个客户端的时候
2016-08-08 23:08:23
5228
原创 windows Socket编程之UDP的服务端和客户端
上一篇讲了TCP的服务端和客户端,本篇文章来介绍一下UDP的服务端和客户端。相比TCP来说,UDP相对比较简单,刚开始的时候,和TCP一样都需要先进行网络环境的初始化,即调用WSAStartup函数。然后呢,我们也需要创建一个socket,这个socket和TCP的那个socket不同,上篇提过TCP创建一个socket调用socket函数时,第二个参数为SOCK_STREAM,而UDP则需要
2016-07-24 22:45:52
17622
1
原创 windows Socket编程之TCP服务端与客户端
在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的。但是它有些缺陷,比如说效率较低等。而从这篇文章开始将介绍socket编程。socket是通过TCP,UDP,IP协议来进行通信,效率较高。本文先介绍TCP的服务端和客户端。TCP是面向连接的,它在进行通信之前呢,需要双方先进行沟通,然后才能进行通信。而且TCP是以数据流的方式进行数据传递,会自动的进行拆包和
2016-07-18 22:10:11
19072
5
原创 windows编程之动态链接库的使用
当我们进行程序的编写的时候,经常需要将一些资源进行重复利用等操作。于是,微软就提出了DLL(动态链接库),它可以很好的将资源进行重复利用。当一个进程加载一个DLL的时候呢,一般都会执行DllMain这个动态链接库的入口点(有时候不会,后面再讲),来看下它的声明:BOOL WINAPI DllMain( HINSTANCE hinstDLL, // dll模块的内存基址 DWO
2016-07-11 22:03:55
736
原创 windows编程之命名管道通信
管道分为两种,一种是匿名管道,一种是命名管道。两者都可以进行进程间的通信,但匿名管道有局限性,它只能在本机上使用,而不能跨网络使用。但是命名管道就不一样了,它弥补了匿名管道的局限性。接下来看下,如何在windows平台下,进行命名管道的通信。首先,要进行两个进行间的通信,必须要有一个进程主动一点,来创建一个命名的管道,调用CreateNamedPipe即可创建一个命名的管道,其声明如下:H
2016-07-10 14:52:00
5905
原创 windows编程之内核模式下的线程同步
上篇讲到了应用层下的线程同步,接下来看下内核模式下的几种同步方式。第一种方式称为互斥量。互斥量呢是一个内核对象,它可以确保一个线程对一个资源的独占访问。互斥量和关键段(上篇提到的)的行为是一样的,区别在于一个是内核对象,一个是应用层的对象。因此,互斥量要比关键段慢很多,但是互斥量可以进行跨进程的同步,而关键段并不行。那么,如何创建一个互斥量呢,MSDN提供了一个名叫做CreateMutex
2016-07-09 14:31:30
1064
原创 windows编程之应用层的线程同步
当我们进行多线程进行编程的时候呢,确实可以让我们的程序变得更加高效,但是,在面临多线程时,我们必须要做好线程之间的同步。比如说,有一个线程在读内存,另一个线程在写入内存,这将发生不可描述的事件,这就好比一个人在另一个人读书的时候修改书中的文字一样。因此,线程同步就变得相当重要了。好在呢,windows提供了很多的方式可以让线程同步变得容易。下面来介绍下在应用层下的几种线程同步方式。第一种是自旋
2016-07-06 23:08:21
964
原创 windows编程之线程池
在讲线程池之前,我们先来看下“池”是什么意思。“池”,我把他归结为一大堆的资源,比如说,内存,线程,网络连接,数据库的连接等一系列的资源,因而与之相对应的就有,内存池,线程池,网络连接池,数据库连接池等。线程池也就是一大堆的线程资源,它们在程序刚开始运行的时候就存在了,等需要它们的时候呢,就可以使用它们,而不必向操作系统去申请。那么我们为何不在需要的时候再向操作系统申请呢?这是由于动态的申
2016-07-05 22:09:05
1451
1
原创 windows编程之线程操作
我们知道,进程是资源分配的最小单位,而线程呢,则是CPU运行的最小单位。在最早的DOS系统下,CPU每次只能运行一个进程且该进程只有一个线程,当该进程执行完退出后,CPU 才能加载另外一个进程。而现在的win系统中,CPU可以运行多个线程。CPU以轮询的方式对线程进行运行,就像一个时钟一样,秒针每隔1秒就进行移动,而1秒则称作CPU的时间片,但这1秒并不是固定的,可能一个线程会多运行几个时
2016-07-04 23:39:13
3443
原创 windows编程之进程枚举的三种方式
在windows中,获取进程枚举有3中方式,首先是进程快照,它涉及到了几个API,来看一下。第一个是CreateToolhelp32Snapshot,用于获取进程相关信息的快照,声明如下:HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //指定快照中包含的系统内容 DWORD th32ProcessID
2016-06-23 00:19:56
1929
原创 windows编程之进程操作
当我们在硬盘上打开一个exe文件,操作系统会把exe加载到我们的内存中,加载到内存中的exe文件就是一个进程。首先,要打开一个进程,windows提供了3个API来供我们使用,第一个是WinExec,声明如下:UINT WinExec( LPCSTR lpCmdLine, // 进程名 UINT uCmdShow // 窗口的样式,如何显示);以上这个API
2016-06-22 14:02:03
775
原创 windows编程之文件遍历
很多时我们需要对文件进行遍历,这里我将对其进行简要介绍。首先,我们来看几个api和结构体,第一个叫WIN32_FIND_DATA结构体,声明如下:typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; //文件属性 FILETIME ftCreationTime; //文件创建时间 FILETIME ft
2016-06-16 23:16:02
2617
原创 windows编程之文件映射
当我们对文件进行读写操作的时候,我们经常会调用ReadFile和WriteFile这两个API,但是如果我们的文件较大,几百兆甚至几G且需要时常修改值B的时候,这时那两个函数可能就不大好了,这时微软提供了另外一种方法--文件映射,来使我们进行文件操作。首先,我们先介绍几个API,第一个就是CreateFileMapping,声明如下:HANDLE CreateFileMapping(
2016-06-16 23:01:22
2468
原创 windows编程之文件操作
总所周知,C/C++标准库里边,有fread,fopen等文件操作,而在windows环境下,微软当然也给我们提供了这样的API,而且比C/C++运行库更好用,效率更高。首先,要进行文件操作,你得打开一个文件或者创建一个文件,而CreateFile这个API就是用来打开和创建一个文件(因为在操作系统看来,系统上的所有东西都是一个个文件,因此,那些串口,硬盘都可以用CreateFile打开)。
2016-06-15 22:06:06
2517
原创 win32 listview控件添加图标
#include #include #include #include "resource.h"#pragma comment(lib,"comctl32.lib")HINSTANCE g_hInst;HWND g_hMainWnd;HWND hListView;void InsertListviewItem(int nPos, WCHAR * wszStr,WCHAR * wszSecond,
2016-05-30 00:34:50
2595
原创 windows编程学习之路--双缓冲绘图
我们绘图的时候,有时会一闪一闪的,这时可以用双缓冲绘图,以避免闪烁。 首先,应该要有一个原本显示的DC,这个我们可以通过一些函数如GetDC()得到。 其次,还要有一个用来在后台画的DC,这个可以通过CreateCompatibleDC()这个函数创建这个内存DC。 然后,还要有一个位图对象,这个通过LoadImage()加载图片或CreateCombatibleBitmap()来建立一个位
2016-04-27 00:29:37
1876
原创 windows编程学习之路--自绘按钮
// DrawButton.cpp : 定义应用程序的入口点。//#include "stdafx.h"#include "DrawButton.h"#pragma comment(lib,"Msimg32.lib")#define MAX_LOADSTRING 100// 全局变量: HINSTANCE hInst; // 当前实例TCHAR szTi
2016-04-26 22:57:54
2169
1
原创 WM_CLOSE,WM_QUIT,WM_DESTROY消息的区别
WM_CLOSE:此消息主要是用户按下关闭按钮的时候,系统会发送这个消息给我们的窗口,此时窗口还没被 销毁。而我们一般在接收这个消息的时候,会调用一个名叫做DestroyWindow的这个 API。 WM_DESTROY: 当调用DestroyWindow的时候,此时窗口被销毁,资源被回收,然后系统会发送一个WM_DESTROY这个消息
2016-04-25 11:04:22
2357
1
原创 Windows编程学习之路--框架介绍
一个Windows 的应用程序,要创建一个窗口我觉得可以分为6个步骤:1. 创建窗口类2. 注册窗口类3. 建立窗口4. 显示窗口5. 更新窗口6. 获取消息下面我就对以上这些步骤做些简单的说明。创建窗口类。其实这一步,就是声明一个WNDCLASS这个结构体,这个结构体里边包含了窗口的一些信息。如窗口样式,菜单,图标等信息,然后将这些成员一一进行赋值。注册窗口类
2016-04-24 22:34:30
3494
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人